home *** CD-ROM | disk | FTP | other *** search
/ Language/OS - Multiplatform Resource Library / LANGUAGE OS.iso / et / et3_0-a1.lha / et3 / src / CompVObject.C < prev    next >
C/C++ Source or Header  |  1992-08-26  |  5KB  |  308 lines

  1. #ifdef __GNUG__
  2. #pragma implementation
  3. #endif
  4.  
  5. #include "CompVObject.h"
  6.  
  7. #include "Class.h"
  8. #include "OrdColl.h"
  9.  
  10. //---- Iterator1 ---------------------------------------------------------------
  11.  
  12. class Iterator1 : public Iterator {
  13.     Object *op;
  14.     int n;
  15. public:
  16.     Iterator1(Object *o)
  17.     { op= o; n= 0; }
  18.     Object *operator()();
  19.     void Reset()
  20.     { n= 0; }
  21. };
  22.  
  23. Object *Iterator1::operator()()
  24. {
  25.     if (n == 0) {
  26.     n= 1;
  27.     return op;
  28.     }
  29.     n= 0;
  30.     return 0;
  31. }
  32.  
  33. //---- CompositeVObject --------------------------------------------------------
  34.  
  35. NewAbstractMetaImpl(CompositeVObject,VObject, (TP(list)));
  36.  
  37. CompositeVObject::CompositeVObject(int id, SeqCollection *cp) : VObject(id)
  38. {
  39.     list= cp;
  40.     if (list) {
  41.     list->ForEach(VObject,SetContainer)(this);
  42.     islist= TRUE;
  43.     } else
  44.     islist= FALSE;
  45. }
  46.  
  47. CompositeVObject::CompositeVObject(int va_(id), ...) : VObject(va_(id))
  48. {
  49.     va_list ap;
  50.     va_start(ap,va_(id));
  51.     list= 0;
  52.     islist= FALSE;
  53.     SetItems(ap);
  54.     va_end(ap);
  55. }
  56.  
  57. CompositeVObject::CompositeVObject(int id, va_list ap) : VObject(id)
  58. {
  59.     list= 0;
  60.     islist= FALSE;
  61.     SetItems(ap);
  62. }
  63.  
  64. CompositeVObject::~CompositeVObject()
  65. {
  66.     if (list) {
  67.     if (islist) {
  68.         SeqCollection *tmp= list;
  69.         list= 0;
  70.         islist= FALSE;
  71.         tmp->ForEach(VObject,ClearContainer)(this);
  72.         tmp->FreeAll();
  73.         delete tmp;
  74.     } else {
  75.         ((VObject*)list)->ClearContainer(this);
  76.         SafeDelete(list);
  77.     }
  78.     }
  79. }
  80.  
  81. VObject *CompositeVObject::At(int n)
  82. {
  83.     if (list) {
  84.     if (islist)
  85.         return (VObject*)list->At(n);
  86.     if (n == 0)
  87.         return (VObject*)list;
  88.     fprintf(stderr, "CompositeVObject::At: %d out of range\n", n);
  89.     }
  90.     return 0;
  91. }
  92.  
  93. int CompositeVObject::Size()
  94. {
  95.     if (list) {
  96.     if (islist)
  97.         return list->Size();
  98.     return 1;
  99.     }
  100.     return 0;
  101. }
  102.  
  103. void CompositeVObject::Add(VObject *vop)
  104. {
  105.     if (vop) {
  106.     if (list == 0) {
  107.         list= (OrdCollection*) vop;
  108.         islist= FALSE;
  109.     } else {
  110.         if (!islist) {
  111.         Object *tmp= list;
  112.         list= new OrdCollection;
  113.         list->Add(tmp);
  114.         islist= TRUE;
  115.         }
  116.         list->Add(vop);
  117.     }
  118.     vop->SetContainer(this);
  119.     if (IsOpen()) {
  120.         vop->Open();
  121.         /*
  122.         ForceRedraw();
  123.         Point e= GetMinSize().extent;
  124.         Point ee= GetExtent();
  125.         if (e.x > ee.x || e.y > ee.y)
  126.         ExtentChanged(this);
  127.         else {
  128.         SetExtent(GetExtent());
  129.         SetOrigin(GetOrigin());
  130.         }
  131.         */
  132.     }
  133.     }
  134. }
  135.  
  136. VObject *CompositeVObject::Remove(VObject *vop)
  137. {
  138.     if (list) {
  139.     VObject *old= 0;
  140.     if (vop && vop->IsOpen()) {
  141.         vop->Close();
  142.         vop->ClearContainer(this);
  143.     }
  144.     if (islist) {
  145.         old= (VObject*) list->RemovePtr(vop);
  146.     } else {
  147.         islist= FALSE;
  148.         if (vop == (VObject*) list) {
  149.         list= 0;
  150.         old= vop;
  151.         }
  152.     }
  153.     if (IsOpen()) {
  154.         ForceRedraw();
  155.         Point e= GetMinSize().extent;
  156.         Point ee= GetExtent();
  157.         if (e.x > ee.x || e.y > ee.y)
  158.         ExtentChanged(this);
  159.         else {
  160.         SetExtent(GetExtent());
  161.         SetOrigin(GetOrigin());
  162.         }
  163.     }
  164.     return old;
  165.     }
  166.     return 0;
  167. }
  168.  
  169. VObject *CompositeVObject::SetAt(int at, VObject *vop)
  170. {
  171.     VObject *old= 0;
  172.     
  173.     if (vop && at < Size()) {
  174.     if (list == 0) {
  175.         list= new OrdCollection;
  176.         islist= TRUE;
  177.     } else {
  178.         if (islist) 
  179.         ;
  180.         else {
  181.         Object *tmp= list;
  182.         list= new OrdCollection;
  183.         list->Add(tmp);
  184.         islist= TRUE;
  185.         }
  186.     }
  187.  
  188.     if (at >= 0) {
  189.         old= At(at);
  190.         if (old) {
  191.         if (old->IsOpen())
  192.             old->Close();
  193.         old->ClearContainer(this);
  194.         }
  195.         list->PutAt(vop, at);
  196.     } else {
  197.         list->AddFirst(vop);
  198.     }
  199.     vop->SetContainer(this);
  200.     if (IsOpen()) {
  201.         vop->Open();
  202.         ForceRedraw();
  203.         Point e= GetMinSize().extent;
  204.         Point ee= GetExtent();
  205.         if (e.x > ee.x || e.y > ee.y)
  206.         ExtentChanged(this);
  207.         else {
  208.         SetExtent(GetExtent());
  209.         SetOrigin(GetOrigin());
  210.         }
  211.     }
  212.     }
  213.     return old;
  214. }
  215.  
  216. Iterator *CompositeVObject::MakeIterator(bool forward)
  217. {
  218.     if (list) {
  219.     if (islist) {
  220.         if (forward)
  221.         return list->MakeIterator();
  222.         return list->MakeReversedIterator();
  223.     }
  224.     return new Iterator1(list);
  225.     }
  226.     return new Iterator0;
  227. }
  228.  
  229. void CompositeVObject::DoObserve(int, int part, void*, Object *op)
  230. {
  231.     if (op == list && part == cPartSenderDied)
  232.     list= 0;
  233. }
  234.  
  235. SeqCollection *CompositeVObject::GetList()
  236. {
  237.     if (!islist) {
  238.     Object *tmp= list;
  239.     list= new OrdCollection;
  240.     list->Add(tmp);
  241.     islist= TRUE;
  242.     }
  243.     return list;
  244. }
  245.  
  246. void CompositeVObject::SetItems(va_list ap)
  247. {
  248.     register VObject *op;
  249.     
  250.     while (op= va_arg(ap, VObject*))
  251.     Add(op);
  252. }
  253.  
  254. void CompositeVObject::SetItems(VObject *vop, va_list ap)
  255. {
  256.     register VObject *op;
  257.     if (vop)
  258.     Add(vop);
  259.     while (op= va_arg(ap, VObject*))
  260.     Add(op);
  261. }
  262.  
  263. void CompositeVObject::SetOrigin(Point origin)
  264. {
  265.     VObject::SetOrigin(origin);
  266.     Iter next(MakeIterator());
  267.     register VObject *vop;
  268.  
  269.     while (vop= (VObject*) next())
  270.     vop->SetOrigin(origin);
  271. }
  272.  
  273. void CompositeVObject::SetExtent(Point extent)
  274. {
  275.     VObject::SetExtent(extent);
  276.     Iter next(MakeIterator());
  277.     register VObject *vop;
  278.  
  279.     while (vop= (VObject*) next())
  280.     vop->CalcExtent();
  281. }
  282.  
  283. OStream& CompositeVObject::PrintOn(OStream &s)
  284. {
  285.     VObject::PrintOn(s);
  286.     return s << list SP;
  287. }
  288.  
  289. IStream& CompositeVObject::ReadFrom(IStream &s)
  290. {
  291.     Object *op;
  292.     VObject::ReadFrom(s);
  293.     list= 0;
  294.     islist= FALSE;
  295.     s >> op;
  296.     if (op) {
  297.     if (op->IsKindOf(OrdCollection))
  298.         islist= TRUE;
  299.     list= (OrdCollection*) op;
  300.     }
  301.     Iter next(MakeIterator());
  302.     VObject *vop;
  303.     while (vop= (VObject*)next())
  304.         vop->SetContainer(this);
  305.     return s;
  306. }
  307.  
  308.